package br.com.threads;
/*
 * Objetivo: Implementar um codigo que sincronize os Threads.
 * Cenario: Tendo cinco produtos em estoque nao deve ser permitido que mais que cinco
 * clientes, ao acessar o programa, consigam comprar o produto quando o estoque esta 
 * negativo. Para este objetivo o metodo onde esta o codigo que faz o pedido foi sincro-
 * nizado. Dentro do codigo e feita uma chamada ao metodo estatico sleep() da classe
 * Thread para permitir que mais que um cliente tenha chance de realizar o pedido.
 */

class Produto implements Runnable{
	private Integer estoque = 5;
	
	public Produto(Integer estoque){
		this.estoque = estoque;
	}
	public synchronized void efetuarPedido(){
		try{
			if(this.estoque > 0){
				System.out.println("Pedido Faturado Para o Cliente: " + Thread.currentThread().getName());
				Thread.sleep(300);
				this.estoque--;
			}else{
				System.out.println("Nao Tem No Estoque Para o Cliente: " +
						Thread.currentThread().getName());
			}
		}catch(InterruptedException e){}
	}
	public void run(){
		try{
			//dentro deste loop esta configurado quantos objetos Thread acessarao o metodo
			//efetuarPedido ao mesmo tempo.
			for(int i = 0; i < 3; i++){
				efetuarPedido();
			}
		}catch(Exception e){}
	}
}
public class PedidoCompra {
	public static void main(String[] args) {
		Produto p = new Produto(5);
		Thread [] t = new Thread[15];//cria um array de Threads com 15 posicoes
		for(int i = 0; i < t.length; i++){
			t[i] = new Thread(p);//vai adicionando uma nova thread ao indice ate atingir
			//o tamanho configurado: 15
			t[i].setName("Cliente-> "  + i);
			t[i].start();//coloca todas as Threads no estado executavel a espera do 
			//agendador, pois neste momento todas tem a mesma prioridade.
		}
	}
}
